{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 328
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 3141,
     "status": "ok",
     "timestamp": 1591121107207,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "SFT2Q81Nhmk6",
    "outputId": "9b3dc7c0-84a5-4d3b-9dfa-f02a7bfb85ae"
   },
   "outputs": [],
   "source": [
    "#!nvidia-smi\n",
    "#using a GeForce GTX1080 Ti for reproducibility for all timing experiments"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 54
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 7628,
     "status": "ok",
     "timestamp": 1591121113311,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "HkOPiDW8c_FB",
    "outputId": "04c23712-a918-4346-bb86-69e8753d95dd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pytorch version:  1.5.0\n",
      "cuda available:  True\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import time\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "from torch import nn, optim, autograd\n",
    "from torch.nn import functional as F\n",
    "from torch.distributions.multivariate_normal import MultivariateNormal\n",
    "import numpy as np\n",
    "from sklearn.utils import shuffle as skshuffle\n",
    "from math import *\n",
    "from backpack import backpack, extend\n",
    "from backpack.extensions import KFAC, DiagHessian\n",
    "from sklearn.metrics import roc_auc_score\n",
    "import scipy\n",
    "from tqdm import tqdm, trange\n",
    "import pytest\n",
    "import matplotlib.pyplot as plt\n",
    "from LB_utils import * \n",
    "\n",
    "print(\"pytorch version: \", torch.__version__)\n",
    "print(\"cuda available: \", torch.cuda.is_available())\n",
    "\n",
    "s = 127\n",
    "np.random.seed(s)\n",
    "torch.manual_seed(s)\n",
    "torch.cuda.manual_seed(s)\n",
    "torch.backends.cudnn.deterministic = True\n",
    "torch.backends.cudnn.benchmark = False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "k8E81UKkc_Fe"
   },
   "source": [
    "# Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "btXBVjRZc_Ff"
   },
   "outputs": [],
   "source": [
    "BATCH_SIZE_TRAIN_CIFAR10 = 128\n",
    "BATCH_SIZE_TEST_CIFAR10 = 128"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 131
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 9830,
     "status": "ok",
     "timestamp": 1591121117173,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "JJ82fe_uc_GQ",
    "outputId": "bcf6359a-7843-416a-e24a-0decc7353b6f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "transform_base = [transforms.ToTensor()]\n",
    "\n",
    "transform_train = transforms.Compose([\n",
    "    transforms.RandomHorizontalFlip(),\n",
    "    transforms.RandomCrop(32, padding=4, padding_mode='reflect'),\n",
    "    ] + transform_base)\n",
    "\n",
    "transform_test = transforms.Compose(transform_base)\n",
    "transform_train = transforms.RandomChoice([transform_train, transform_test])\n",
    "\n",
    "#~/data/cifar10\n",
    "CIFAR10_trainset = torchvision.datasets.CIFAR10(root='~/data/cifar10', train=True, download=True, transform=transform_train)\n",
    "CIFAR10_train_loader = torch.utils.data.DataLoader(CIFAR10_trainset, batch_size=BATCH_SIZE_TRAIN_CIFAR10, shuffle=True, num_workers=2)\n",
    "\n",
    "#~/data/cifar10\n",
    "CIFAR10_testset = torchvision.datasets.CIFAR10(root='~/data/cifar10', train=False, download=True, transform=transform_test)\n",
    "CIFAR10_test_loader = torch.utils.data.DataLoader(CIFAR10_testset, batch_size=BATCH_SIZE_TEST_CIFAR10, shuffle=False, num_workers=2)\n",
    "\n",
    "classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n",
    "\n",
    "dataiter = iter(CIFAR10_train_loader)\n",
    "images, labels = dataiter.next()\n",
    "nrow = int(BATCH_SIZE_TRAIN_CIFAR10/4)\n",
    "imshow(torchvision.utils.make_grid(images, nrow=nrow))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 131
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 12846,
     "status": "ok",
     "timestamp": 1591121120425,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "GfOmcawIc_Gt",
    "outputId": "d6ecf52f-92ce-464f-e5e1-17d328e14468"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#load in CIFAR100\n",
    "BATCH_SIZE_TRAIN_CIFAR100 = 128\n",
    "BATCH_SIZE_TEST_CIFAR100 = 128\n",
    "\n",
    "#'~/data/cifar100'\n",
    "CIFAR100_train = torchvision.datasets.CIFAR100(root='~/data/cifar100', train=True,\n",
    "                                       download=True, transform=transform_train)\n",
    "CIFAR100_train_loader = torch.utils.data.DataLoader(CIFAR100_train, batch_size=BATCH_SIZE_TRAIN_CIFAR100,\n",
    "                                         shuffle=False)\n",
    "#'~/data/cifar100'\n",
    "CIFAR100_test = torchvision.datasets.CIFAR100(root='~/data/cifar100', train=False,\n",
    "                                       download=True, transform=transform_test)\n",
    "CIFAR100_test_loader = torch.utils.data.DataLoader(CIFAR100_test, batch_size=BATCH_SIZE_TEST_CIFAR100,\n",
    "                                         shuffle=False)\n",
    "\n",
    "CIFAR100_classes = [\n",
    "    'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle', \n",
    "    'bicycle', 'bottle', 'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel', \n",
    "    'can', 'castle', 'caterpillar', 'cattle', 'chair', 'chimpanzee', 'clock', \n",
    "    'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur', \n",
    "    'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster', \n",
    "    'house', 'kangaroo', 'keyboard', 'lamp', 'lawn_mower', 'leopard', 'lion',\n",
    "    'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain', 'mouse',\n",
    "    'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear',\n",
    "    'pickup_truck', 'pine_tree', 'plain', 'plate', 'poppy', 'porcupine',\n",
    "    'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket', 'rose',\n",
    "    'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake',\n",
    "    'spider', 'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table',\n",
    "    'tank', 'telephone', 'television', 'tiger', 'tractor', 'train', 'trout',\n",
    "    'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman',\n",
    "    'worm'\n",
    "]\n",
    "\n",
    "dataiter = iter(CIFAR100_train_loader)\n",
    "images, labels = dataiter.next()\n",
    "nrow = int(BATCH_SIZE_TRAIN_CIFAR100/4)\n",
    "imshow(torchvision.utils.make_grid(images, nrow=nrow))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 131
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 17463,
     "status": "ok",
     "timestamp": 1591121125183,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "xDMTdXMNc_G8",
    "outputId": "4fadbd06-41e4-46b6-a31a-b3754acc0622"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# load SVHN\n",
    "BATCH_SIZE_TRAIN_SVHN = 128\n",
    "BATCH_SIZE_TEST_SVHN = 128\n",
    "\n",
    "#'~/data/SVHN'\n",
    "train_data_SVHN = torchvision.datasets.SVHN('~/data/SVHN', split='train',\n",
    "                             download=False, transform=transform_train)\n",
    "\n",
    "#'~/data/SVHN'\n",
    "test_data_SVHN = torchvision.datasets.SVHN('~/data/SVHN', split='test',\n",
    "                             download=False, transform=transform_test)\n",
    "\n",
    "SVHN_train_loader = torch.utils.data.DataLoader(test_data_SVHN, batch_size=BATCH_SIZE_TRAIN_SVHN)\n",
    "SVHN_test_loader = torch.utils.data.DataLoader(test_data_SVHN, batch_size=BATCH_SIZE_TEST_SVHN)\n",
    "\n",
    "dataiter = iter(SVHN_train_loader)\n",
    "images, labels = dataiter.next()\n",
    "nrow = int(BATCH_SIZE_TRAIN_SVHN/4)\n",
    "imshow(torchvision.utils.make_grid(images, nrow=nrow))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ySv8B-GHc_HE"
   },
   "source": [
    "# Train CIFAR10 on ResNet18 (or load weights)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "sjkkKSjFc_HG"
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "import torch.backends.cudnn as cudnn\n",
    "\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "qnu4LyH3c_HL"
   },
   "outputs": [],
   "source": [
    "# We copy and pasted the ResNet-18 definition from the official PyTorch repo and adapted it slightly\n",
    "# We renamed the last layer to self.linear to unify and simplify it\n",
    "\n",
    "class BasicBlock(nn.Module):\n",
    "    expansion = 1\n",
    "\n",
    "    def __init__(self, in_planes, planes, stride=1):\n",
    "        super(BasicBlock, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)\n",
    "        self.bn1 = nn.BatchNorm2d(planes)\n",
    "        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False)\n",
    "        self.bn2 = nn.BatchNorm2d(planes)\n",
    "\n",
    "        self.shortcut = nn.Sequential()\n",
    "        if stride != 1 or in_planes != self.expansion*planes:\n",
    "            self.shortcut = nn.Sequential(\n",
    "                nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),\n",
    "                nn.BatchNorm2d(self.expansion*planes)\n",
    "            )\n",
    "\n",
    "    def forward(self, x):\n",
    "        out = F.relu(self.bn1(self.conv1(x)))\n",
    "        out = self.bn2(self.conv2(out))\n",
    "        out += self.shortcut(x)\n",
    "        out = F.relu(out)\n",
    "        return out\n",
    "\n",
    "\n",
    "class ResNet(nn.Module):\n",
    "    def __init__(self, block, num_blocks, num_classes=10, num_of_channels=3):\n",
    "        super(ResNet, self).__init__()\n",
    "        self.in_planes = 64\n",
    "\n",
    "        self.conv1 = nn.Conv2d(num_of_channels, 64, kernel_size=3, stride=1, padding=1, bias=False)\n",
    "        self.bn1 = nn.BatchNorm2d(64)\n",
    "        self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=1)\n",
    "        self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2)\n",
    "        self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2)\n",
    "        self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2)\n",
    "        self.linear = nn.Linear(512*block.expansion, num_classes)\n",
    "\n",
    "    def _make_layer(self, block, planes, num_blocks, stride):\n",
    "        strides = [stride] + [1]*(num_blocks-1)\n",
    "        layers = []\n",
    "        for stride in strides:\n",
    "            layers.append(block(self.in_planes, planes, stride))\n",
    "            self.in_planes = planes * block.expansion\n",
    "        return nn.Sequential(*layers)\n",
    "\n",
    "    def forward(self, x):\n",
    "        out = self.features(x)\n",
    "        out = self.linear(out)\n",
    "        return out\n",
    "\n",
    "    def features(self, x):\n",
    "        out = F.relu(self.bn1(self.conv1(x)))\n",
    "        out = self.layer1(out)\n",
    "        out = self.layer2(out)\n",
    "        out = self.layer3(out)\n",
    "        out = self.layer4(out)\n",
    "        out = F.avg_pool2d(out, 4)\n",
    "        out = out.view(out.size(0), -1)\n",
    "        return out\n",
    "\n",
    "\n",
    "def ResNet18(num_of_channels=3, num_classes=10):\n",
    "    if num_classes <= 2:\n",
    "        num_classes = 1\n",
    "\n",
    "    return ResNet(BasicBlock, [2,2,2,2],\n",
    "                  num_of_channels=num_of_channels,\n",
    "                  num_classes=num_classes)\n",
    "\n",
    "def ResNet18(num_classes=10):\n",
    "    return ResNet(BasicBlock, [2,2,2,2], num_classes=num_classes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "ORChHBtxc_Hp"
   },
   "outputs": [],
   "source": [
    "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
    "cuda_status = torch.cuda.is_available()\n",
    "CIFAR10_model = ResNet18().to(device)\n",
    "best_acc = 0  # best test accuracy\n",
    "start_epoch = 0  # start from epoch 0 or last checkpoint epoch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "V2E-2hK3c_H7"
   },
   "outputs": [],
   "source": [
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(CIFAR10_model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "U2xS8TCEc_IF"
   },
   "outputs": [],
   "source": [
    "# Training\n",
    "def train(net, epoch, optimizer, trainloader, filename):\n",
    "    print('\\nEpoch: %d' % epoch)\n",
    "    net.train()\n",
    "    train_loss = 0\n",
    "    correct = 0\n",
    "    total = 0\n",
    "    for batch_idx, (inputs, targets) in enumerate(trainloader):\n",
    "        inputs, targets = inputs.to(device), targets.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        outputs = net(inputs)\n",
    "        loss = criterion(outputs, targets)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "        train_loss += loss.item()\n",
    "        _, predicted = outputs.max(1)\n",
    "        total += targets.size(0)\n",
    "        correct += predicted.eq(targets).sum().item()\n",
    "        \n",
    "    \n",
    "    print(\"train loss: \", train_loss)\n",
    "    print(\"train accuracy: \", correct/total)\n",
    "    print(\"saving model at: {}\".format(filename))\n",
    "    torch.save(net.state_dict(), filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "GvrM1bILc_IO"
   },
   "outputs": [],
   "source": [
    "def test(net, epoch, testloader, path, save=False):\n",
    "    global best_acc\n",
    "    net.eval()\n",
    "    test_loss = 0\n",
    "    correct = 0\n",
    "    total = 0\n",
    "    with torch.no_grad():\n",
    "        for batch_idx, (inputs, targets) in enumerate(testloader):\n",
    "            inputs, targets = inputs.to(device), targets.to(device)\n",
    "            outputs = net(inputs)\n",
    "            loss = criterion(outputs, targets)\n",
    "\n",
    "            test_loss += loss.item()\n",
    "            _, predicted = outputs.max(1)\n",
    "            total += targets.size(0)\n",
    "            correct += predicted.eq(targets).sum().item()\n",
    "            \n",
    "        acc = correct/total\n",
    "        if acc > best_acc and save: \n",
    "            best_acc = acc\n",
    "            print(\"saving model at: {}\".format(path))\n",
    "            torch.save(net.state_dict(), path)\n",
    "\n",
    "\n",
    "        print(\"test loss: \", test_loss)\n",
    "        print(\"current acc: {}; best acc: {}\".format(acc, best_acc) )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "g5_u3JBfc_IU"
   },
   "outputs": [],
   "source": [
    "# We know that you should not validate on your test data but our paper is not about the training process\n",
    "# but rather about what you can do once you have a well-trained model. \n",
    "\n",
    "def train_all():\n",
    "    CIFAR10_PATH = 'pretrained_weights/CIFAR10_resnet18_s{}.pth'.format(s)\n",
    "    CIFAR10_PATH_BEST = 'pretrained_weights/CIFAR10_resnet18_best_s{}.pth'.format(s)\n",
    "    lr = 0.1\n",
    "    epoch = 0\n",
    "    for e in [30, 50, 50]:\n",
    "        print(\"current learning rate: \", lr)\n",
    "        for _ in range(e):\n",
    "            optimizer = optim.SGD(CIFAR10_model.parameters(), lr=lr, momentum=0.9, weight_decay=5e-4)\n",
    "            train(CIFAR10_model, epoch, optimizer, CIFAR10_train_loader, CIFAR10_PATH)\n",
    "            test(CIFAR10_model, epoch, CIFAR10_test_loader, save=True, path=CIFAR10_PATH_BEST)\n",
    "            epoch += 1\n",
    "        lr /= 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "TBhBW8yFc_Ib"
   },
   "outputs": [],
   "source": [
    "##### uncomment this if you want to train a network ######\n",
    "\n",
    "#t0 = time.time()\n",
    "#train_all()\n",
    "#t1 = time.time()\n",
    "#print(\"training took: {} seconds\".format(t1-t0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "#training took: 4288.249864578247 seconds which is 71.47 minutes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 24560,
     "status": "ok",
     "timestamp": 1591121138024,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "Ygkql29Oc_Ih",
    "outputId": "f83ef7dc-e3b5-4cbc-9c3c-85a5f408edd5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading model from: pretrained_weights/CIFAR10_resnet18_pretrained.pth\n",
      "test loss:  14.309499010443687\n",
      "current acc: 0.9542; best acc: 0\n"
     ]
    }
   ],
   "source": [
    "##### if you already have a trained model ##############\n",
    "CIFAR10_PATH = 'pretrained_weights/CIFAR10_resnet18_pretrained.pth'\n",
    "#CIFAR10_PATH = 'pretrained_weights/CIFAR10_resnet18_best_s{}.pth'.format(s)\n",
    "CIFAR10_model = ResNet18().to(device)\n",
    "print(\"loading model from: {}\".format(CIFAR10_PATH))\n",
    "CIFAR10_model.load_state_dict(torch.load(CIFAR10_PATH))#, map_location=torch.device('cpu')))\n",
    "#test the model\n",
    "test(CIFAR10_model, 0, CIFAR10_test_loader, save=False, path=CIFAR10_PATH)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "YasrUI_6c_Ir"
   },
   "source": [
    "# prepare Gaussians (Diag and KFAC)\n",
    "\n",
    "If you want to play around with other settings you can change the prior variance var0 here. Note that the prior variance for Diagonal or KFAC Hessian can be quite different."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n: 512 inputs to linear layer with m: 10 classes\n",
      "Batch: 0/391\n",
      "Batch: 1/391\n",
      "Batch: 2/391\n",
      "Batch: 3/391\n",
      "Batch: 4/391\n",
      "Batch: 5/391\n",
      "Batch: 6/391\n",
      "Batch: 7/391\n",
      "Batch: 8/391\n",
      "Batch: 9/391\n",
      "Batch: 10/391\n",
      "Batch: 11/391\n",
      "Batch: 12/391\n",
      "Batch: 13/391\n",
      "Batch: 14/391\n",
      "Batch: 15/391\n",
      "Batch: 16/391\n",
      "Batch: 17/391\n",
      "Batch: 18/391\n",
      "Batch: 19/391\n",
      "Batch: 20/391\n",
      "Batch: 21/391\n",
      "Batch: 22/391\n",
      "Batch: 23/391\n",
      "Batch: 24/391\n",
      "Batch: 25/391\n",
      "Batch: 26/391\n",
      "Batch: 27/391\n",
      "Batch: 28/391\n",
      "Batch: 29/391\n",
      "Batch: 30/391\n",
      "Batch: 31/391\n",
      "Batch: 32/391\n",
      "Batch: 33/391\n",
      "Batch: 34/391\n",
      "Batch: 35/391\n",
      "Batch: 36/391\n",
      "Batch: 37/391\n",
      "Batch: 38/391\n",
      "Batch: 39/391\n",
      "Batch: 40/391\n",
      "Batch: 41/391\n",
      "Batch: 42/391\n",
      "Batch: 43/391\n",
      "Batch: 44/391\n",
      "Batch: 45/391\n",
      "Batch: 46/391\n",
      "Batch: 47/391\n",
      "Batch: 48/391\n",
      "Batch: 49/391\n",
      "Batch: 50/391\n",
      "Batch: 51/391\n",
      "Batch: 52/391\n",
      "Batch: 53/391\n",
      "Batch: 54/391\n",
      "Batch: 55/391\n",
      "Batch: 56/391\n",
      "Batch: 57/391\n",
      "Batch: 58/391\n",
      "Batch: 59/391\n",
      "Batch: 60/391\n",
      "Batch: 61/391\n",
      "Batch: 62/391\n",
      "Batch: 63/391\n",
      "Batch: 64/391\n",
      "Batch: 65/391\n",
      "Batch: 66/391\n",
      "Batch: 67/391\n",
      "Batch: 68/391\n",
      "Batch: 69/391\n",
      "Batch: 70/391\n",
      "Batch: 71/391\n",
      "Batch: 72/391\n",
      "Batch: 73/391\n",
      "Batch: 74/391\n",
      "Batch: 75/391\n",
      "Batch: 76/391\n",
      "Batch: 77/391\n",
      "Batch: 78/391\n",
      "Batch: 79/391\n",
      "Batch: 80/391\n",
      "Batch: 81/391\n",
      "Batch: 82/391\n",
      "Batch: 83/391\n",
      "Batch: 84/391\n",
      "Batch: 85/391\n",
      "Batch: 86/391\n",
      "Batch: 87/391\n",
      "Batch: 88/391\n",
      "Batch: 89/391\n",
      "Batch: 90/391\n",
      "Batch: 91/391\n",
      "Batch: 92/391\n",
      "Batch: 93/391\n",
      "Batch: 94/391\n",
      "Batch: 95/391\n",
      "Batch: 96/391\n",
      "Batch: 97/391\n",
      "Batch: 98/391\n",
      "Batch: 99/391\n",
      "Batch: 100/391\n",
      "Batch: 101/391\n",
      "Batch: 102/391\n",
      "Batch: 103/391\n",
      "Batch: 104/391\n",
      "Batch: 105/391\n",
      "Batch: 106/391\n",
      "Batch: 107/391\n",
      "Batch: 108/391\n",
      "Batch: 109/391\n",
      "Batch: 110/391\n",
      "Batch: 111/391\n",
      "Batch: 112/391\n",
      "Batch: 113/391\n",
      "Batch: 114/391\n",
      "Batch: 115/391\n",
      "Batch: 116/391\n",
      "Batch: 117/391\n",
      "Batch: 118/391\n",
      "Batch: 119/391\n",
      "Batch: 120/391\n",
      "Batch: 121/391\n",
      "Batch: 122/391\n",
      "Batch: 123/391\n",
      "Batch: 124/391\n",
      "Batch: 125/391\n",
      "Batch: 126/391\n",
      "Batch: 127/391\n",
      "Batch: 128/391\n",
      "Batch: 129/391\n",
      "Batch: 130/391\n",
      "Batch: 131/391\n",
      "Batch: 132/391\n",
      "Batch: 133/391\n",
      "Batch: 134/391\n",
      "Batch: 135/391\n",
      "Batch: 136/391\n",
      "Batch: 137/391\n",
      "Batch: 138/391\n",
      "Batch: 139/391\n",
      "Batch: 140/391\n",
      "Batch: 141/391\n",
      "Batch: 142/391\n",
      "Batch: 143/391\n",
      "Batch: 144/391\n",
      "Batch: 145/391\n",
      "Batch: 146/391\n",
      "Batch: 147/391\n",
      "Batch: 148/391\n",
      "Batch: 149/391\n",
      "Batch: 150/391\n",
      "Batch: 151/391\n",
      "Batch: 152/391\n",
      "Batch: 153/391\n",
      "Batch: 154/391\n",
      "Batch: 155/391\n",
      "Batch: 156/391\n",
      "Batch: 157/391\n",
      "Batch: 158/391\n",
      "Batch: 159/391\n",
      "Batch: 160/391\n",
      "Batch: 161/391\n",
      "Batch: 162/391\n",
      "Batch: 163/391\n",
      "Batch: 164/391\n",
      "Batch: 165/391\n",
      "Batch: 166/391\n",
      "Batch: 167/391\n",
      "Batch: 168/391\n",
      "Batch: 169/391\n",
      "Batch: 170/391\n",
      "Batch: 171/391\n",
      "Batch: 172/391\n",
      "Batch: 173/391\n",
      "Batch: 174/391\n",
      "Batch: 175/391\n",
      "Batch: 176/391\n",
      "Batch: 177/391\n",
      "Batch: 178/391\n",
      "Batch: 179/391\n",
      "Batch: 180/391\n",
      "Batch: 181/391\n",
      "Batch: 182/391\n",
      "Batch: 183/391\n",
      "Batch: 184/391\n",
      "Batch: 185/391\n",
      "Batch: 186/391\n",
      "Batch: 187/391\n",
      "Batch: 188/391\n",
      "Batch: 189/391\n",
      "Batch: 190/391\n",
      "Batch: 191/391\n",
      "Batch: 192/391\n",
      "Batch: 193/391\n",
      "Batch: 194/391\n",
      "Batch: 195/391\n",
      "Batch: 196/391\n",
      "Batch: 197/391\n",
      "Batch: 198/391\n",
      "Batch: 199/391\n",
      "Batch: 200/391\n",
      "Batch: 201/391\n",
      "Batch: 202/391\n",
      "Batch: 203/391\n",
      "Batch: 204/391\n",
      "Batch: 205/391\n",
      "Batch: 206/391\n",
      "Batch: 207/391\n",
      "Batch: 208/391\n",
      "Batch: 209/391\n",
      "Batch: 210/391\n",
      "Batch: 211/391\n",
      "Batch: 212/391\n",
      "Batch: 213/391\n",
      "Batch: 214/391\n",
      "Batch: 215/391\n",
      "Batch: 216/391\n",
      "Batch: 217/391\n",
      "Batch: 218/391\n",
      "Batch: 219/391\n",
      "Batch: 220/391\n",
      "Batch: 221/391\n",
      "Batch: 222/391\n",
      "Batch: 223/391\n",
      "Batch: 224/391\n",
      "Batch: 225/391\n",
      "Batch: 226/391\n",
      "Batch: 227/391\n",
      "Batch: 228/391\n",
      "Batch: 229/391\n",
      "Batch: 230/391\n",
      "Batch: 231/391\n",
      "Batch: 232/391\n",
      "Batch: 233/391\n",
      "Batch: 234/391\n",
      "Batch: 235/391\n",
      "Batch: 236/391\n",
      "Batch: 237/391\n",
      "Batch: 238/391\n",
      "Batch: 239/391\n",
      "Batch: 240/391\n",
      "Batch: 241/391\n",
      "Batch: 242/391\n",
      "Batch: 243/391\n",
      "Batch: 244/391\n",
      "Batch: 245/391\n",
      "Batch: 246/391\n",
      "Batch: 247/391\n",
      "Batch: 248/391\n",
      "Batch: 249/391\n",
      "Batch: 250/391\n",
      "Batch: 251/391\n",
      "Batch: 252/391\n",
      "Batch: 253/391\n",
      "Batch: 254/391\n",
      "Batch: 255/391\n",
      "Batch: 256/391\n",
      "Batch: 257/391\n",
      "Batch: 258/391\n",
      "Batch: 259/391\n",
      "Batch: 260/391\n",
      "Batch: 261/391\n",
      "Batch: 262/391\n",
      "Batch: 263/391\n",
      "Batch: 264/391\n",
      "Batch: 265/391\n",
      "Batch: 266/391\n",
      "Batch: 267/391\n",
      "Batch: 268/391\n",
      "Batch: 269/391\n",
      "Batch: 270/391\n",
      "Batch: 271/391\n",
      "Batch: 272/391\n",
      "Batch: 273/391\n",
      "Batch: 274/391\n",
      "Batch: 275/391\n",
      "Batch: 276/391\n",
      "Batch: 277/391\n",
      "Batch: 278/391\n",
      "Batch: 279/391\n",
      "Batch: 280/391\n",
      "Batch: 281/391\n",
      "Batch: 282/391\n",
      "Batch: 283/391\n",
      "Batch: 284/391\n",
      "Batch: 285/391\n",
      "Batch: 286/391\n",
      "Batch: 287/391\n",
      "Batch: 288/391\n",
      "Batch: 289/391\n",
      "Batch: 290/391\n",
      "Batch: 291/391\n",
      "Batch: 292/391\n",
      "Batch: 293/391\n",
      "Batch: 294/391\n",
      "Batch: 295/391\n",
      "Batch: 296/391\n",
      "Batch: 297/391\n",
      "Batch: 298/391\n",
      "Batch: 299/391\n",
      "Batch: 300/391\n",
      "Batch: 301/391\n",
      "Batch: 302/391\n",
      "Batch: 303/391\n",
      "Batch: 304/391\n",
      "Batch: 305/391\n",
      "Batch: 306/391\n",
      "Batch: 307/391\n",
      "Batch: 308/391\n",
      "Batch: 309/391\n",
      "Batch: 310/391\n",
      "Batch: 311/391\n",
      "Batch: 312/391\n",
      "Batch: 313/391\n",
      "Batch: 314/391\n",
      "Batch: 315/391\n",
      "Batch: 316/391\n",
      "Batch: 317/391\n",
      "Batch: 318/391\n",
      "Batch: 319/391\n",
      "Batch: 320/391\n",
      "Batch: 321/391\n",
      "Batch: 322/391\n",
      "Batch: 323/391\n",
      "Batch: 324/391\n",
      "Batch: 325/391\n",
      "Batch: 326/391\n",
      "Batch: 327/391\n",
      "Batch: 328/391\n",
      "Batch: 329/391\n",
      "Batch: 330/391\n",
      "Batch: 331/391\n",
      "Batch: 332/391\n",
      "Batch: 333/391\n",
      "Batch: 334/391\n",
      "Batch: 335/391\n",
      "Batch: 336/391\n",
      "Batch: 337/391\n",
      "Batch: 338/391\n",
      "Batch: 339/391\n",
      "Batch: 340/391\n",
      "Batch: 341/391\n",
      "Batch: 342/391\n",
      "Batch: 343/391\n",
      "Batch: 344/391\n",
      "Batch: 345/391\n",
      "Batch: 346/391\n",
      "Batch: 347/391\n",
      "Batch: 348/391\n",
      "Batch: 349/391\n",
      "Batch: 350/391\n",
      "Batch: 351/391\n",
      "Batch: 352/391\n",
      "Batch: 353/391\n",
      "Batch: 354/391\n",
      "Batch: 355/391\n",
      "Batch: 356/391\n",
      "Batch: 357/391\n",
      "Batch: 358/391\n",
      "Batch: 359/391\n",
      "Batch: 360/391\n",
      "Batch: 361/391\n",
      "Batch: 362/391\n",
      "Batch: 363/391\n",
      "Batch: 364/391\n",
      "Batch: 365/391\n",
      "Batch: 366/391\n",
      "Batch: 367/391\n",
      "Batch: 368/391\n",
      "Batch: 369/391\n",
      "Batch: 370/391\n",
      "Batch: 371/391\n",
      "Batch: 372/391\n",
      "Batch: 373/391\n",
      "Batch: 374/391\n",
      "Batch: 375/391\n",
      "Batch: 376/391\n",
      "Batch: 377/391\n",
      "Batch: 378/391\n",
      "Batch: 379/391\n",
      "Batch: 380/391\n",
      "Batch: 381/391\n",
      "Batch: 382/391\n",
      "Batch: 383/391\n",
      "Batch: 384/391\n",
      "Batch: 385/391\n",
      "Batch: 386/391\n",
      "Batch: 387/391\n",
      "Batch: 388/391\n",
      "Batch: 389/391\n",
      "Batch: 390/391\n",
      "391\n",
      "M_W_post size:  torch.Size([512, 10])\n",
      "M_b_post size:  torch.Size([10])\n",
      "C_W_post size:  torch.Size([10, 512])\n",
      "C_b_post size:  torch.Size([10])\n",
      "preparing Gaussians took 45.79704785346985 seconds which is 0.7632841308911641 minutes\n"
     ]
    }
   ],
   "source": [
    "t0 = time.time()\n",
    "M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D = Diag_second_order(model=CIFAR10_model,\n",
    "                                                                   train_loader=CIFAR10_train_loader,\n",
    "                                                                   var0 = 1e-2, #1e-2\n",
    "                                                                   device=device)\n",
    "t1 = time.time()\n",
    "time_gaussian = t1-t0\n",
    "print(\"preparing Gaussians took {} seconds which is {} minutes\".format(time_gaussian, time_gaussian/60))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#preparing Gaussians took 29.08268094062805 seconds which is 0.48471134901046753 minutes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 160694,
     "status": "ok",
     "timestamp": 1591121298741,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "G9pcQTaNc_JP",
    "outputId": "010a25c4-e573-43ac-f368-90e599bf4105"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Batch: 0/391\n",
      "Batch: 1/391\n",
      "Batch: 2/391\n",
      "Batch: 3/391\n",
      "Batch: 4/391\n",
      "Batch: 5/391\n",
      "Batch: 6/391\n",
      "Batch: 7/391\n",
      "Batch: 8/391\n",
      "Batch: 9/391\n",
      "Batch: 10/391\n",
      "Batch: 11/391\n",
      "Batch: 12/391\n",
      "Batch: 13/391\n",
      "Batch: 14/391\n",
      "Batch: 15/391\n",
      "Batch: 16/391\n",
      "Batch: 17/391\n",
      "Batch: 18/391\n",
      "Batch: 19/391\n",
      "Batch: 20/391\n",
      "Batch: 21/391\n",
      "Batch: 22/391\n",
      "Batch: 23/391\n",
      "Batch: 24/391\n",
      "Batch: 25/391\n",
      "Batch: 26/391\n",
      "Batch: 27/391\n",
      "Batch: 28/391\n",
      "Batch: 29/391\n",
      "Batch: 30/391\n",
      "Batch: 31/391\n",
      "Batch: 32/391\n",
      "Batch: 33/391\n",
      "Batch: 34/391\n",
      "Batch: 35/391\n",
      "Batch: 36/391\n",
      "Batch: 37/391\n",
      "Batch: 38/391\n",
      "Batch: 39/391\n",
      "Batch: 40/391\n",
      "Batch: 41/391\n",
      "Batch: 42/391\n",
      "Batch: 43/391\n",
      "Batch: 44/391\n",
      "Batch: 45/391\n",
      "Batch: 46/391\n",
      "Batch: 47/391\n",
      "Batch: 48/391\n",
      "Batch: 49/391\n",
      "Batch: 50/391\n",
      "Batch: 51/391\n",
      "Batch: 52/391\n",
      "Batch: 53/391\n",
      "Batch: 54/391\n",
      "Batch: 55/391\n",
      "Batch: 56/391\n",
      "Batch: 57/391\n",
      "Batch: 58/391\n",
      "Batch: 59/391\n",
      "Batch: 60/391\n",
      "Batch: 61/391\n",
      "Batch: 62/391\n",
      "Batch: 63/391\n",
      "Batch: 64/391\n",
      "Batch: 65/391\n",
      "Batch: 66/391\n",
      "Batch: 67/391\n",
      "Batch: 68/391\n",
      "Batch: 69/391\n",
      "Batch: 70/391\n",
      "Batch: 71/391\n",
      "Batch: 72/391\n",
      "Batch: 73/391\n",
      "Batch: 74/391\n",
      "Batch: 75/391\n",
      "Batch: 76/391\n",
      "Batch: 77/391\n",
      "Batch: 78/391\n",
      "Batch: 79/391\n",
      "Batch: 80/391\n",
      "Batch: 81/391\n",
      "Batch: 82/391\n",
      "Batch: 83/391\n",
      "Batch: 84/391\n",
      "Batch: 85/391\n",
      "Batch: 86/391\n",
      "Batch: 87/391\n",
      "Batch: 88/391\n",
      "Batch: 89/391\n",
      "Batch: 90/391\n",
      "Batch: 91/391\n",
      "Batch: 92/391\n",
      "Batch: 93/391\n",
      "Batch: 94/391\n",
      "Batch: 95/391\n",
      "Batch: 96/391\n",
      "Batch: 97/391\n",
      "Batch: 98/391\n",
      "Batch: 99/391\n",
      "Batch: 100/391\n",
      "Batch: 101/391\n",
      "Batch: 102/391\n",
      "Batch: 103/391\n",
      "Batch: 104/391\n",
      "Batch: 105/391\n",
      "Batch: 106/391\n",
      "Batch: 107/391\n",
      "Batch: 108/391\n",
      "Batch: 109/391\n",
      "Batch: 110/391\n",
      "Batch: 111/391\n",
      "Batch: 112/391\n",
      "Batch: 113/391\n",
      "Batch: 114/391\n",
      "Batch: 115/391\n",
      "Batch: 116/391\n",
      "Batch: 117/391\n",
      "Batch: 118/391\n",
      "Batch: 119/391\n",
      "Batch: 120/391\n",
      "Batch: 121/391\n",
      "Batch: 122/391\n",
      "Batch: 123/391\n",
      "Batch: 124/391\n",
      "Batch: 125/391\n",
      "Batch: 126/391\n",
      "Batch: 127/391\n",
      "Batch: 128/391\n",
      "Batch: 129/391\n",
      "Batch: 130/391\n",
      "Batch: 131/391\n",
      "Batch: 132/391\n",
      "Batch: 133/391\n",
      "Batch: 134/391\n",
      "Batch: 135/391\n",
      "Batch: 136/391\n",
      "Batch: 137/391\n",
      "Batch: 138/391\n",
      "Batch: 139/391\n",
      "Batch: 140/391\n",
      "Batch: 141/391\n",
      "Batch: 142/391\n",
      "Batch: 143/391\n",
      "Batch: 144/391\n",
      "Batch: 145/391\n",
      "Batch: 146/391\n",
      "Batch: 147/391\n",
      "Batch: 148/391\n",
      "Batch: 149/391\n",
      "Batch: 150/391\n",
      "Batch: 151/391\n",
      "Batch: 152/391\n",
      "Batch: 153/391\n",
      "Batch: 154/391\n",
      "Batch: 155/391\n",
      "Batch: 156/391\n",
      "Batch: 157/391\n",
      "Batch: 158/391\n",
      "Batch: 159/391\n",
      "Batch: 160/391\n",
      "Batch: 161/391\n",
      "Batch: 162/391\n",
      "Batch: 163/391\n",
      "Batch: 164/391\n",
      "Batch: 165/391\n",
      "Batch: 166/391\n",
      "Batch: 167/391\n",
      "Batch: 168/391\n",
      "Batch: 169/391\n",
      "Batch: 170/391\n",
      "Batch: 171/391\n",
      "Batch: 172/391\n",
      "Batch: 173/391\n",
      "Batch: 174/391\n",
      "Batch: 175/391\n",
      "Batch: 176/391\n",
      "Batch: 177/391\n",
      "Batch: 178/391\n",
      "Batch: 179/391\n",
      "Batch: 180/391\n",
      "Batch: 181/391\n",
      "Batch: 182/391\n",
      "Batch: 183/391\n",
      "Batch: 184/391\n",
      "Batch: 185/391\n",
      "Batch: 186/391\n",
      "Batch: 187/391\n",
      "Batch: 188/391\n",
      "Batch: 189/391\n",
      "Batch: 190/391\n",
      "Batch: 191/391\n",
      "Batch: 192/391\n",
      "Batch: 193/391\n",
      "Batch: 194/391\n",
      "Batch: 195/391\n",
      "Batch: 196/391\n",
      "Batch: 197/391\n",
      "Batch: 198/391\n",
      "Batch: 199/391\n",
      "Batch: 200/391\n",
      "Batch: 201/391\n",
      "Batch: 202/391\n",
      "Batch: 203/391\n",
      "Batch: 204/391\n",
      "Batch: 205/391\n",
      "Batch: 206/391\n",
      "Batch: 207/391\n",
      "Batch: 208/391\n",
      "Batch: 209/391\n",
      "Batch: 210/391\n",
      "Batch: 211/391\n",
      "Batch: 212/391\n",
      "Batch: 213/391\n",
      "Batch: 214/391\n",
      "Batch: 215/391\n",
      "Batch: 216/391\n",
      "Batch: 217/391\n",
      "Batch: 218/391\n",
      "Batch: 219/391\n",
      "Batch: 220/391\n",
      "Batch: 221/391\n",
      "Batch: 222/391\n",
      "Batch: 223/391\n",
      "Batch: 224/391\n",
      "Batch: 225/391\n",
      "Batch: 226/391\n",
      "Batch: 227/391\n",
      "Batch: 228/391\n",
      "Batch: 229/391\n",
      "Batch: 230/391\n",
      "Batch: 231/391\n",
      "Batch: 232/391\n",
      "Batch: 233/391\n",
      "Batch: 234/391\n",
      "Batch: 235/391\n",
      "Batch: 236/391\n",
      "Batch: 237/391\n",
      "Batch: 238/391\n",
      "Batch: 239/391\n",
      "Batch: 240/391\n",
      "Batch: 241/391\n",
      "Batch: 242/391\n",
      "Batch: 243/391\n",
      "Batch: 244/391\n",
      "Batch: 245/391\n",
      "Batch: 246/391\n",
      "Batch: 247/391\n",
      "Batch: 248/391\n",
      "Batch: 249/391\n",
      "Batch: 250/391\n",
      "Batch: 251/391\n",
      "Batch: 252/391\n",
      "Batch: 253/391\n",
      "Batch: 254/391\n",
      "Batch: 255/391\n",
      "Batch: 256/391\n",
      "Batch: 257/391\n",
      "Batch: 258/391\n",
      "Batch: 259/391\n",
      "Batch: 260/391\n",
      "Batch: 261/391\n",
      "Batch: 262/391\n",
      "Batch: 263/391\n",
      "Batch: 264/391\n",
      "Batch: 265/391\n",
      "Batch: 266/391\n",
      "Batch: 267/391\n",
      "Batch: 268/391\n",
      "Batch: 269/391\n",
      "Batch: 270/391\n",
      "Batch: 271/391\n",
      "Batch: 272/391\n",
      "Batch: 273/391\n",
      "Batch: 274/391\n",
      "Batch: 275/391\n",
      "Batch: 276/391\n",
      "Batch: 277/391\n",
      "Batch: 278/391\n",
      "Batch: 279/391\n",
      "Batch: 280/391\n",
      "Batch: 281/391\n",
      "Batch: 282/391\n",
      "Batch: 283/391\n",
      "Batch: 284/391\n",
      "Batch: 285/391\n",
      "Batch: 286/391\n",
      "Batch: 287/391\n",
      "Batch: 288/391\n",
      "Batch: 289/391\n",
      "Batch: 290/391\n",
      "Batch: 291/391\n",
      "Batch: 292/391\n",
      "Batch: 293/391\n",
      "Batch: 294/391\n",
      "Batch: 295/391\n",
      "Batch: 296/391\n",
      "Batch: 297/391\n",
      "Batch: 298/391\n",
      "Batch: 299/391\n",
      "Batch: 300/391\n",
      "Batch: 301/391\n",
      "Batch: 302/391\n",
      "Batch: 303/391\n",
      "Batch: 304/391\n",
      "Batch: 305/391\n",
      "Batch: 306/391\n",
      "Batch: 307/391\n",
      "Batch: 308/391\n",
      "Batch: 309/391\n",
      "Batch: 310/391\n",
      "Batch: 311/391\n",
      "Batch: 312/391\n",
      "Batch: 313/391\n",
      "Batch: 314/391\n",
      "Batch: 315/391\n",
      "Batch: 316/391\n",
      "Batch: 317/391\n",
      "Batch: 318/391\n",
      "Batch: 319/391\n",
      "Batch: 320/391\n",
      "Batch: 321/391\n",
      "Batch: 322/391\n",
      "Batch: 323/391\n",
      "Batch: 324/391\n",
      "Batch: 325/391\n",
      "Batch: 326/391\n",
      "Batch: 327/391\n",
      "Batch: 328/391\n",
      "Batch: 329/391\n",
      "Batch: 330/391\n",
      "Batch: 331/391\n",
      "Batch: 332/391\n",
      "Batch: 333/391\n",
      "Batch: 334/391\n",
      "Batch: 335/391\n",
      "Batch: 336/391\n",
      "Batch: 337/391\n",
      "Batch: 338/391\n",
      "Batch: 339/391\n",
      "Batch: 340/391\n",
      "Batch: 341/391\n",
      "Batch: 342/391\n",
      "Batch: 343/391\n",
      "Batch: 344/391\n",
      "Batch: 345/391\n",
      "Batch: 346/391\n",
      "Batch: 347/391\n",
      "Batch: 348/391\n",
      "Batch: 349/391\n",
      "Batch: 350/391\n",
      "Batch: 351/391\n",
      "Batch: 352/391\n",
      "Batch: 353/391\n",
      "Batch: 354/391\n",
      "Batch: 355/391\n",
      "Batch: 356/391\n",
      "Batch: 357/391\n",
      "Batch: 358/391\n",
      "Batch: 359/391\n",
      "Batch: 360/391\n",
      "Batch: 361/391\n",
      "Batch: 362/391\n",
      "Batch: 363/391\n",
      "Batch: 364/391\n",
      "Batch: 365/391\n",
      "Batch: 366/391\n",
      "Batch: 367/391\n",
      "Batch: 368/391\n",
      "Batch: 369/391\n",
      "Batch: 370/391\n",
      "Batch: 371/391\n",
      "Batch: 372/391\n",
      "Batch: 373/391\n",
      "Batch: 374/391\n",
      "Batch: 375/391\n",
      "Batch: 376/391\n",
      "Batch: 377/391\n",
      "Batch: 378/391\n",
      "Batch: 379/391\n",
      "Batch: 380/391\n",
      "Batch: 381/391\n",
      "Batch: 382/391\n",
      "Batch: 383/391\n",
      "Batch: 384/391\n",
      "Batch: 385/391\n",
      "Batch: 386/391\n",
      "Batch: 387/391\n",
      "Batch: 388/391\n",
      "Batch: 389/391\n",
      "Batch: 390/391\n",
      "M_W_post size:  torch.Size([512, 10])\n",
      "M_b_post size:  torch.Size([10])\n",
      "U_post size:  torch.Size([10, 10])\n",
      "V_post size:  torch.Size([512, 512])\n",
      "B_post size:  torch.Size([10, 10])\n"
     ]
    }
   ],
   "source": [
    "M_W_post_K, M_b_post_K, U_post_K, V_post_K, B_post_K = KFLP_second_order(model=CIFAR10_model,\n",
    "                                                               train_loader=CIFAR10_train_loader,\n",
    "                                                               var0 = 2, #2\n",
    "                                                               device=device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "eJsYd6Aec_Ke"
   },
   "outputs": [],
   "source": [
    "targets_CIFAR10 = CIFAR10_testset.targets\n",
    "targets_CIFAR100 = CIFAR100_test.targets\n",
    "targets_SVHN = []\n",
    "for x,y in SVHN_test_loader:\n",
    "    targets_SVHN.append(y)\n",
    "targets_SVHN = torch.cat(targets_SVHN).numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "dZ85ABdwHSrC"
   },
   "outputs": [],
   "source": [
    "#number of samples to draw from the Gaussian\n",
    "num_samples = 1000"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "BdICbIMYc_LJ"
   },
   "source": [
    "# MAP estimate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "EQfaElEvc_LK"
   },
   "outputs": [],
   "source": [
    "CIFAR10_test_in_MAP = predict_MAP(CIFAR10_model, CIFAR10_test_loader, cuda=cuda_status).cpu().numpy()\n",
    "CIFAR10_test_out_CIFAR100_MAP = predict_MAP(CIFAR10_model, CIFAR100_test_loader, cuda=cuda_status).cpu().numpy()\n",
    "CIFAR10_test_out_SVHN_MAP = predict_MAP(CIFAR10_model, SVHN_test_loader, cuda=cuda_status).cpu().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "uPMpD2cac_LP"
   },
   "outputs": [],
   "source": [
    "acc_in_MAP, prob_correct_in_MAP, ent_in_MAP, MMC_in_MAP = get_in_dist_values(CIFAR10_test_in_MAP, targets_CIFAR10)\n",
    "acc_out_CIFAR100_MAP, prob_correct_out_CIFAR100_MAP, ent_out_CIFAR100, MMC_out_CIFAR100_MAP, auroc_out_CIFAR100_MAP = get_out_dist_values(CIFAR10_test_in_MAP, CIFAR10_test_out_CIFAR100_MAP, targets_CIFAR100)\n",
    "acc_out_SVHN_MAP, prob_correct_out_SVHN_MAP, ent_out_SVHN, MMC_out_SVHN_MAP, auroc_out_SVHN_MAP = get_out_dist_values(CIFAR10_test_in_MAP, CIFAR10_test_out_SVHN_MAP, targets_SVHN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 397888,
     "status": "ok",
     "timestamp": 1588243471704,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "26fknEjRc_LS",
    "outputId": "f636f2c3-c80f-4ce6-e877-19d7569c6830"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[In, MAP, CIFAR10] Accuracy: 0.954; average entropy: 0.072;     MMC: 0.977; Prob @ correct: 0.100\n",
      "[Out-CIFAR100, MAP, CIFAR10] Accuracy: 0.009; Average entropy: 0.547;    MMC: 0.811; AUROC: 0.879; Prob @ correct: 0.100\n",
      "[Out-SVHN, MAP, CIFAR10] Accuracy: 0.092; Average entropy: 0.733;    MMC: 0.755; AUROC: 0.928; Prob @ correct: 0.100\n"
     ]
    }
   ],
   "source": [
    "print_in_dist_values(acc_in_MAP, prob_correct_in_MAP, ent_in_MAP, MMC_in_MAP, 'CIFAR10', 'MAP')\n",
    "print_out_dist_values(acc_out_CIFAR100_MAP, prob_correct_out_CIFAR100_MAP, ent_out_CIFAR100, MMC_out_CIFAR100_MAP, auroc_out_CIFAR100_MAP, 'CIFAR10', 'CIFAR100', 'MAP')\n",
    "print_out_dist_values(acc_out_SVHN_MAP, prob_correct_out_SVHN_MAP, ent_out_SVHN, MMC_out_SVHN_MAP, auroc_out_SVHN_MAP, 'CIFAR10', 'SVHN', 'MAP')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 127
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 397877,
     "status": "ok",
     "timestamp": 1588243471705,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "RHgarR_Dc_LY",
    "outputId": "39a782d3-00cf-4d88-c8e7-4beea6a20a88"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.954 with std 0.000\n",
      "MMC in: 0.977 with std 0.000\n",
      "MMC out CIFAR100: 0.811 with std 0.000\n",
      "MMC out SVHN: 0.755 with std 0.000\n",
      "AUROC out CIFAR100: 0.879 with std 0.000\n",
      "AUROC out SVHN: 0.928 with std 0.000\n"
     ]
    }
   ],
   "source": [
    "#MAP estimate\n",
    "#seeds are 123,124,125,126,127\n",
    "acc_in = [0.954, 0.954, 0.954, 0.954, 0.954]\n",
    "mmc_in = [0.977, 0.977, 0.977, 0.977, 0.977]\n",
    "mmc_out_CIFAR100 = [0.811, 0.811, 0.811, 0.811, 0.811]\n",
    "mmc_out_SVHN = [0.755, 0.755, 0.755, 0.755, 0.755]\n",
    "\n",
    "auroc_out_CIFAR100 = [0.879, 0.879, 0.879, 0.879, 0.879]\n",
    "auroc_out_SVHN = [0.928, 0.928, 0.928, 0.928, 0.928]\n",
    "\n",
    "print(\"accuracy: {:.03f} with std {:.03f}\".format(np.mean(acc_in), np.std(acc_in)))\n",
    "\n",
    "print(\"MMC in: {:.03f} with std {:.03f}\".format(np.mean(mmc_in), np.std(mmc_in)))\n",
    "print(\"MMC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_CIFAR100), np.std(mmc_out_CIFAR100)))\n",
    "print(\"MMC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_SVHN), np.std(mmc_out_SVHN)))\n",
    "\n",
    "print(\"AUROC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_CIFAR100), np.std(auroc_out_CIFAR100)))\n",
    "print(\"AUROC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_SVHN), np.std(auroc_out_SVHN)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "UqikIW_Cc_Lb"
   },
   "source": [
    "# Diagonal estimate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict_diagonal_sampling(model, test_loader, M_W_post, M_b_post, C_W_post, C_b_post, n_samples, verbose=False, cuda=False, timing=False):\n",
    "    py = []\n",
    "    max_len = len(test_loader)\n",
    "    if timing:\n",
    "        time_sum_fw = 0\n",
    "        time_sum_mc = 0\n",
    "\n",
    "    for batch_idx, (x, y) in enumerate(test_loader):\n",
    "\n",
    "        if cuda:\n",
    "            x, y = x.cuda(), y.cuda()\n",
    "\n",
    "        t0_fw = time.time()\n",
    "        phi = model.features(x).detach()\n",
    "\n",
    "        mu, Sigma = get_Gaussian_output(phi, M_W_post, M_b_post, C_W_post, C_b_post)\n",
    "        t1_fw = time.time()\n",
    "\n",
    "        post_pred = MultivariateNormal(mu, Sigma)\n",
    "\n",
    "        # MC-integral\n",
    "        t0_mc = time.time()\n",
    "        py_ = 0\n",
    "\n",
    "        for _ in range(n_samples):\n",
    "            f_s = post_pred.rsample()\n",
    "            py_ += torch.softmax(f_s, 1)\n",
    "\n",
    "        py_ /= n_samples\n",
    "        py_ = py_.detach()\n",
    "\n",
    "        py.append(py_)\n",
    "        t1_mc = time.time()\n",
    "        if timing:\n",
    "            time_sum_fw += (t1_fw - t0_fw)\n",
    "            time_sum_mc += (t1_mc - t0_mc)\n",
    "\n",
    "        if verbose:\n",
    "            print(\"Batch: {}/{}\".format(batch_idx, max_len))\n",
    "\n",
    "    if timing: \n",
    "        print(\"time used for forward pass: {}\".format(time_sum_fw))\n",
    "        print(\"time used for sampling with {} samples: {}\".format(n_samples, time_sum_mc))\n",
    "    \n",
    "    return torch.cat(py, dim=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 452527,
     "status": "ok",
     "timestamp": 1588243526367,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "e38KQHHAc_Lc",
    "outputId": "df598af1-8a3e-4d38-8130-b399b79eaf0f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "time used for forward pass: 0.6632184982299805\n",
      "time used for sampling with 1000 samples: 13.039254903793335\n",
      "time used for forward pass: 0.6622967720031738\n",
      "time used for sampling with 1000 samples: 13.119536876678467\n",
      "time used for forward pass: 1.54921555519104\n",
      "time used for sampling with 1000 samples: 30.521629333496094\n"
     ]
    }
   ],
   "source": [
    "CIFAR10_test_in_D = predict_diagonal_sampling(CIFAR10_model, CIFAR10_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, n_samples=num_samples, cuda=cuda_status, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_CIFAR100_D = predict_diagonal_sampling(CIFAR10_model, CIFAR100_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, n_samples=num_samples, cuda=cuda_status, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_SVHN_D = predict_diagonal_sampling(CIFAR10_model, SVHN_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, n_samples=num_samples, cuda=cuda_status, timing=True).cpu().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "forward pass timing: 0.448 with std. 0.004\n",
      "mc 1000 timing: 8.183 with std. 0.080\n",
      "mc 100 timing: 0.867 with std. 0.004\n",
      "mc 10 timing: 0.117 with std. 0.001\n",
      "percentage forward: 0.052 vs mc 1000: 0.948\n",
      "percentage forward: 0.341 vs mc 100: 0.659\n",
      "percentage forward: 0.793 vs mc 10: 0.207\n"
     ]
    }
   ],
   "source": [
    "#timings for forward pass vs sampling as presented in the paper\n",
    "\n",
    "fw_pass = np.array([0.4554176330566406, 0.44563722610473633, 0.44574522972106934, 0.44403839111328125, 0.44765353202819824])\n",
    "mc_1000 = np.array([8.315938234329224, 8.18410873413086, 8.117920637130737, 8.08596658706665, 8.212565183639526])\n",
    "mc_100 =  np.array([0.8649516105651855, 0.8614475727081299, 0.8721733093261719, 0.8692750930786133, 0.8676304817199707])\n",
    "mc_10 =   np.array([0.11789608001708984, 0.11717033386230469, 0.11659884452819824, 0.11590909957885742, 0.11641597747802734])\n",
    "\n",
    "print(\"forward pass timing: {:.03f} with std. {:.03f}\".format(np.mean(fw_pass), np.std(fw_pass)))\n",
    "print(\"mc 1000 timing: {:.03f} with std. {:.03f}\".format(np.mean(mc_1000), np.std(mc_1000)))\n",
    "print(\"mc 100 timing: {:.03f} with std. {:.03f}\".format(np.mean(mc_100), np.std(mc_100)))\n",
    "print(\"mc 10 timing: {:.03f} with std. {:.03f}\".format(np.mean(mc_10), np.std(mc_10)))\n",
    "\n",
    "fw_mc1000 = np.mean(fw_pass) + np.mean(mc_1000)\n",
    "fw_mc100 = np.mean(fw_pass) + np.mean(mc_100)\n",
    "fw_mc10 = np.mean(fw_pass) + np.mean(mc_10)\n",
    "print(\"percentage forward: {:.03f} vs mc 1000: {:.03f}\".format(np.mean(fw_pass)/fw_mc1000, np.mean(mc_1000)/fw_mc1000))\n",
    "print(\"percentage forward: {:.03f} vs mc 100: {:.03f}\".format(np.mean(fw_pass)/fw_mc100, np.mean(mc_100)/fw_mc100))\n",
    "print(\"percentage forward: {:.03f} vs mc 10: {:.03f}\".format(np.mean(fw_pass)/fw_mc10, np.mean(mc_10)/fw_mc10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "yotu_TyJc_Li"
   },
   "outputs": [],
   "source": [
    "acc_in_D, prob_correct_in_D, ent_in_D, MMC_in_D = get_in_dist_values(CIFAR10_test_in_D, targets_CIFAR10)\n",
    "acc_out_CIFAR100_D, prob_correct_out_CIFAR100_D, ent_out_CIFAR100_D, MMC_out_CIFAR100_D, auroc_out_CIFAR100_D = get_out_dist_values(CIFAR10_test_in_D, CIFAR10_test_out_CIFAR100_D, targets_CIFAR100)\n",
    "acc_out_SVHN_D, prob_correct_out_SVHN_D, ent_out_SVHN_D, MMC_out_SVHN_D, auroc_out_SVHN_D = get_out_dist_values(CIFAR10_test_in_D, CIFAR10_test_out_SVHN_D, targets_SVHN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 452517,
     "status": "ok",
     "timestamp": 1588243526375,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "0E8xqHRbc_Ln",
    "outputId": "cbfcef83-e228-47d0-bb2a-7a0c3b2f17ba"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[In, Diag, CIFAR10] Accuracy: 0.954; average entropy: 0.080;     MMC: 0.975; Prob @ correct: 0.100\n",
      "[Out-CIFAR100, Diag, CIFAR10] Accuracy: 0.009; Average entropy: 0.581;    MMC: 0.798; AUROC: 0.880; Prob @ correct: 0.100\n",
      "[Out-SVHN, Diag, CIFAR10] Accuracy: 0.092; Average entropy: 0.771;    MMC: 0.741; AUROC: 0.928; Prob @ correct: 0.100\n"
     ]
    }
   ],
   "source": [
    "print_in_dist_values(acc_in_D, prob_correct_in_D, ent_in_D, MMC_in_D, 'CIFAR10', 'Diag')\n",
    "print_out_dist_values(acc_out_CIFAR100_D, prob_correct_out_CIFAR100_D, ent_out_CIFAR100_D, MMC_out_CIFAR100_D, auroc_out_CIFAR100_D, 'CIFAR10', 'CIFAR100', 'Diag')\n",
    "print_out_dist_values(acc_out_SVHN_D, prob_correct_out_SVHN_D, ent_out_SVHN_D, MMC_out_SVHN_D, auroc_out_SVHN_D, 'CIFAR10', 'SVHN', 'Diag')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 182
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 452499,
     "status": "ok",
     "timestamp": 1588243526379,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "lXVODmzEc_Lt",
    "outputId": "a8bd73f7-7a65-4d79-986e-1f5f7b974398"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sampling Bridge time in: 6.582 with std 0.066\n",
      "Sampling Bridge time out CIFAR100: 6.578 with std 0.068\n",
      "Sampling Bridge time out SVHN: 16.994 with std 0.193\n",
      "accuracy: 0.954 with std 0.000\n",
      "MMC in: 0.948 with std 0.000\n",
      "MMC out CIFAR100: 0.708 with std 0.000\n",
      "MMC out SVHN: 0.643 with std 0.000\n",
      "AUROC out CIFAR100: 0.889 with std 0.000\n",
      "AUROC out SVHN: 0.933 with std 0.000\n"
     ]
    }
   ],
   "source": [
    "#Diag Sampling with 1000 samples as presented in the main paper\n",
    "#seeds are 123,124,125,126,127\n",
    "time_lpb_in = [6.6971423625946045, 6.527644395828247, 6.597438812255859, 6.5087058544158936, 6.581128835678101]\n",
    "time_lpb_out_CIFAR100 = [6.678761959075928, 6.576663494110107, 6.6211583614349365, 6.486044645309448, 6.526758193969727]\n",
    "time_lpb_out_SVHN = [17.291815280914307, 16.949442863464355, 17.131528854370117, 16.811217546463013, 16.7869553565979\n",
    "]\n",
    "\n",
    "acc_in = [0.955, 0.954, 0.954, 0.954, 0.954]\n",
    "mmc_in = [0.948, 0.948, 0.948, 0.948, 0.948]\n",
    "mmc_out_CIFAR100 = [0.708, 0.708, 0.708, 0.708, 0.708]\n",
    "mmc_out_SVHN = [0.643, 0.643, 0.643, 0.643, 0.643]\n",
    "\n",
    "auroc_out_CIFAR100 = [0.889, 0.889, 0.888, 0.889, 0.889]\n",
    "auroc_out_SVHN = [0.933, 0.932, 0.933, 0.933, 0.933]\n",
    "\n",
    "print(\"Sampling Bridge time in: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_in), np.std(time_lpb_in)))\n",
    "print(\"Sampling Bridge time out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_out_CIFAR100), np.std(time_lpb_out_CIFAR100)))\n",
    "print(\"Sampling Bridge time out SVHN: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_out_SVHN), np.std(time_lpb_out_SVHN)))\n",
    "\n",
    "print(\"accuracy: {:.03f} with std {:.03f}\".format(np.mean(acc_in), np.std(acc_in)))\n",
    "\n",
    "print(\"MMC in: {:.03f} with std {:.03f}\".format(np.mean(mmc_in), np.std(mmc_in)))\n",
    "print(\"MMC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_CIFAR100), np.std(mmc_out_CIFAR100)))\n",
    "print(\"MMC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_SVHN), np.std(mmc_out_SVHN)))\n",
    "\n",
    "print(\"AUROC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_CIFAR100), np.std(auroc_out_CIFAR100)))\n",
    "print(\"AUROC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_SVHN), np.std(auroc_out_SVHN)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ZZj9IvJOc_MX"
   },
   "source": [
    "# KFAC estimate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 506003,
     "status": "ok",
     "timestamp": 1588243579895,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "Xe76pG0wc_Ma",
    "outputId": "8ed99314-6971-448e-decd-1d636525dc7b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "time used for sampling with 1000 samples: 11.090741634368896\n",
      "time used for sampling with 1000 samples: 11.142581939697266\n",
      "time used for sampling with 1000 samples: 31.652571201324463\n"
     ]
    }
   ],
   "source": [
    "CIFAR10_test_in_K = predict_KFAC_sampling(CIFAR10_model, CIFAR10_test_loader, M_W_post_K, M_b_post_K, U_post_K, V_post_K, B_post_K, n_samples=num_samples, cuda=cuda_status, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_CIFAR100_K = predict_KFAC_sampling(CIFAR10_model, CIFAR100_test_loader, M_W_post_K, M_b_post_K, U_post_K, V_post_K, B_post_K, n_samples=num_samples, cuda=cuda_status, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_SVHN_K = predict_KFAC_sampling(CIFAR10_model, SVHN_test_loader, M_W_post_K, M_b_post_K, U_post_K, V_post_K, B_post_K, n_samples=num_samples, cuda=cuda_status, timing=True).cpu().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "8ARClhE8c_Mg"
   },
   "outputs": [],
   "source": [
    "acc_in_K, prob_correct_in_K, ent_in_K, MMC_in_K = get_in_dist_values(CIFAR10_test_in_K, targets_CIFAR10)\n",
    "acc_out_CIFAR100_K, prob_correct_out_CIFAR100_K, ent_out_CIFAR100_K, MMC_out_CIFAR100_K, auroc_out_CIFAR100_K = get_out_dist_values(CIFAR10_test_in_K, CIFAR10_test_out_CIFAR100_K, targets_CIFAR100)\n",
    "acc_out_SVHN_K, prob_correct_out_SVHN_K, ent_out_SVHN_K, MMC_out_SVHN_K, auroc_out_SVHN_K = get_out_dist_values(CIFAR10_test_in_K, CIFAR10_test_out_SVHN_K, targets_SVHN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 505987,
     "status": "ok",
     "timestamp": 1588243579899,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "ewwgsSe9c_Ml",
    "outputId": "3247e7ac-d10d-4c23-d073-39e6b7050141"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[In, KFAC, CIFAR10] Accuracy: 0.954; average entropy: 0.267;     MMC: 0.934; Prob @ correct: 0.100\n",
      "[Out-CIFAR100, KFAC, CIFAR10] Accuracy: 0.009; Average entropy: 1.007;    MMC: 0.665; AUROC: 0.885; Prob @ correct: 0.100\n",
      "[Out-SVHN, KFAC, CIFAR10] Accuracy: 0.092; Average entropy: 1.243;    MMC: 0.590; AUROC: 0.934; Prob @ correct: 0.100\n"
     ]
    }
   ],
   "source": [
    "print_in_dist_values(acc_in_K, prob_correct_in_K, ent_in_K, MMC_in_K, 'CIFAR10', 'KFAC')\n",
    "print_out_dist_values(acc_out_CIFAR100_K, prob_correct_out_CIFAR100_K, ent_out_CIFAR100_K, MMC_out_CIFAR100_K, auroc_out_CIFAR100_K, 'CIFAR10', 'CIFAR100', 'KFAC')\n",
    "print_out_dist_values(acc_out_SVHN_K, prob_correct_out_SVHN_K, ent_out_SVHN_K, MMC_out_SVHN_K, auroc_out_SVHN_K, 'CIFAR10', 'SVHN', 'KFAC')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 182
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 505967,
     "status": "ok",
     "timestamp": 1588243579905,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "mRRO6uebc_Mq",
    "outputId": "bd4f7209-6c6d-4924-c98f-821d0202975b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Laplace Bridge time in: 6.609 with std 0.068\n",
      "Laplace Bridge time out CIFAR100: 6.581 with std 0.072\n",
      "Laplace Bridge time out notmnist: 16.963 with std 0.220\n",
      "accuracy: 0.954 with std 0.000\n",
      "MMC in: 0.857 with std 0.003\n",
      "MMC out CIFAR100: 0.562 with std 0.003\n",
      "MMC out SVHN: 0.484 with std 0.004\n",
      "AUROC out CIFAR100: 0.886 with std 0.001\n",
      "AUROC out SVHN: 0.939 with std 0.001\n"
     ]
    }
   ],
   "source": [
    "#KFAC approximation of the Hessian with 1000 samples as presented in the main paper\n",
    "#seeds are 123,124,125,126,127\n",
    "time_lpb_in = [6.726973295211792, 6.580109119415283, 6.641083717346191, 6.549118518829346, 6.549356698989868]\n",
    "time_lpb_out_CIFAR100 = [6.703295469284058, 6.578643083572388, 6.578174114227295, 6.478750705718994, 6.568273544311523]\n",
    "time_lpb_out_SVHN = [17.26579451560974, 16.797159910202026, 17.12232232093811, 16.649921417236328, 16.981988191604614]\n",
    "\n",
    "\n",
    "acc_in = [0.954, 0.954, 0.954, 0.954, 0.954]\n",
    "mmc_in = [0.857, 0.860, 0.860, 0.852, 0.857]\n",
    "mmc_out_CIFAR100 = [0.561, 0.565, 0.565, 0.557, 0.561]\n",
    "mmc_out_SVHN = [0.484, 0.485, 0.489, 0.478, 0.484]\n",
    "\n",
    "\n",
    "auroc_out_CIFAR100 = [0.886, 0.887, 0.885, 0.886, 0.885]\n",
    "auroc_out_SVHN = [0.939, 0.939, 0.938, 0.940, 0.938]\n",
    "\n",
    "\n",
    "print(\"Laplace Bridge time in: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_in), np.std(time_lpb_in)))\n",
    "print(\"Laplace Bridge time out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_out_CIFAR100), np.std(time_lpb_out_CIFAR100)))\n",
    "print(\"Laplace Bridge time out notmnist: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_out_SVHN), np.std(time_lpb_out_SVHN)))\n",
    "\n",
    "print(\"accuracy: {:.03f} with std {:.03f}\".format(np.mean(acc_in), np.std(acc_in)))\n",
    "\n",
    "print(\"MMC in: {:.03f} with std {:.03f}\".format(np.mean(mmc_in), np.std(mmc_in)))\n",
    "print(\"MMC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_CIFAR100), np.std(mmc_out_CIFAR100)))\n",
    "print(\"MMC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_SVHN), np.std(mmc_out_SVHN)))\n",
    "\n",
    "print(\"AUROC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_CIFAR100), np.std(auroc_out_CIFAR100)))\n",
    "print(\"AUROC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_SVHN), np.std(auroc_out_SVHN)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "wl2O4llSc_M1"
   },
   "source": [
    "# Laplace Bridge estimate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 551516,
     "status": "ok",
     "timestamp": 1588243625465,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "wdwRD0V8c_M2",
    "outputId": "997ab5e3-7a4c-44a5-9b05-42dd69cd879b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total time used for forward pass: 0.86208\n",
      "total time used for Laplace Bridge: 0.03456\n",
      "total time used for forward pass: 0.70963\n",
      "total time used for Laplace Bridge: 0.02774\n",
      "total time used for forward pass: 1.90970\n",
      "total time used for Laplace Bridge: 0.07455\n"
     ]
    }
   ],
   "source": [
    "CIFAR10_test_in_LB = predict_LB(CIFAR10_model, CIFAR10_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, verbose=False, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_CIFAR100_LB = predict_LB(CIFAR10_model, CIFAR100_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_SVHN_LB = predict_LB(CIFAR10_model, SVHN_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, timing=True).cpu().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "timing for Laplace Bridge: 0.014 with std 0.000\n",
      "percentage forward: 0.970 vs lb: 0.030\n"
     ]
    }
   ],
   "source": [
    "# timings for forward pass vs Laplace Bridge as presented in the main paper\n",
    "time_lb = np.array([0.01397, 0.01397, 0.01405, 0.01389, 0.01402])\n",
    "\n",
    "print(\"timing for Laplace Bridge: {:.03f} with std {:.03f}\".format(np.mean(time_lb), np.std(time_lb)))\n",
    "\n",
    "fw_lb = np.mean(fw_pass) + np.mean(time_lb)\n",
    "print(\"percentage forward: {:.03f} vs lb: {:.03f}\".format(np.mean(fw_pass)/fw_lb, np.mean(time_lb)/fw_lb))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "08wlLgMec_M9"
   },
   "outputs": [],
   "source": [
    "#normalize to get the MAP estimate (which is the mode) of the Dirichlet\n",
    "CIFAR10_test_in_LBn = CIFAR10_test_in_LB/CIFAR10_test_in_LB.sum(1).reshape(-1,1)\n",
    "CIFAR10_test_out_CIFAR100_LBn = CIFAR10_test_out_CIFAR100_LB/CIFAR10_test_out_CIFAR100_LB.sum(1).reshape(-1,1)\n",
    "CIFAR10_test_out_SVHN_LBn = CIFAR10_test_out_SVHN_LB/CIFAR10_test_out_SVHN_LB.sum(1).reshape(-1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "5BVHBhW5c_ND"
   },
   "outputs": [],
   "source": [
    "acc_in_LB, prob_correct_in_LB, ent_in_LB, MMC_in_LB = get_in_dist_values(CIFAR10_test_in_LBn, targets_CIFAR10)\n",
    "acc_out_CIFAR100_LB, prob_correct_out_CIFAR100_LB, ent_out_CIFAR100_LB, MMC_out_CIFAR100_LB, auroc_out_CIFAR100_LB = get_out_dist_values(CIFAR10_test_in_LBn, CIFAR10_test_out_CIFAR100_LBn, targets_CIFAR100)\n",
    "acc_out_SVHN_LB, prob_correct_out_SVHN_LB, ent_out_SVHN_LB, MMC_out_SVHN_LB, auroc_out_SVHN_LB = get_out_dist_values(CIFAR10_test_in_LBn, CIFAR10_test_out_SVHN_LBn, targets_SVHN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 551492,
     "status": "ok",
     "timestamp": 1588243625468,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "NJx4wLw-c_NI",
    "outputId": "ac8ea466-91d6-4ef2-c365-29f677e78b33"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[In, Laplace Bridge, CIFAR10] Accuracy: 0.954; average entropy: 0.140;     MMC: 0.966; Prob @ correct: 0.100\n",
      "[Out-CIFAR100, Laplace Bridge, CIFAR10] Accuracy: 0.009; Average entropy: 0.856;    MMC: 0.742; AUROC: 0.866; Prob @ correct: 0.100\n",
      "[Out-SVHN, Laplace Bridge, CIFAR10] Accuracy: 0.092; Average entropy: 1.177;    MMC: 0.647; AUROC: 0.934; Prob @ correct: 0.100\n"
     ]
    }
   ],
   "source": [
    "print_in_dist_values(acc_in_LB, prob_correct_in_LB, ent_in_LB, MMC_in_LB, 'CIFAR10', 'Laplace Bridge')\n",
    "print_out_dist_values(acc_out_CIFAR100_LB, prob_correct_out_CIFAR100_LB, ent_out_CIFAR100_LB, MMC_out_CIFAR100_LB, auroc_out_CIFAR100_LB, 'CIFAR10', 'CIFAR100', 'Laplace Bridge')\n",
    "print_out_dist_values(acc_out_SVHN_LB, prob_correct_out_SVHN_LB, ent_out_SVHN_LB, MMC_out_SVHN_LB, auroc_out_SVHN_LB, 'CIFAR10', 'SVHN', 'Laplace Bridge')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 182
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 551484,
     "status": "ok",
     "timestamp": 1588243625470,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "Pxhs0u1Dc_NP",
    "outputId": "8950588c-6ec8-4c55-dd96-dc7394590331"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Laplace Bridge time in: 0.017 with std 0.000\n",
      "Laplace Bridge time out CIFAR100: 0.016 with std 0.000\n",
      "Laplace Bridge time out notmnist: 0.041 with std 0.001\n",
      "accuracy: 0.954 with std 0.000\n",
      "MMC in: 0.966 with std 0.000\n",
      "MMC out CIFAR100: 0.742 with std 0.000\n",
      "MMC out SVHN: 0.647 with std 0.000\n",
      "AUROC out CIFAR100: 0.866 with std 0.000\n",
      "AUROC out SVHN: 0.934 with std 0.000\n"
     ]
    }
   ],
   "source": [
    "#Laplace Bridge results as presented in the main paper\n",
    "#seeds are 123,124,125,126,127\n",
    "time_lpb_in = [0.01661, 0.01664, 0.01658, 0.01646, 0.01734]\n",
    "time_lpb_out_CIFAR100 = [0.01575, 0.01610, 0.01561, 0.01592, 0.01615]\n",
    "time_lpb_out_SVHN = [0.04018, 0.04055, 0.04020, 0.04041, 0.04276]\n",
    "\n",
    "\n",
    "acc_in = [0.954, 0.954, 0.954, 0.954, 0.954]\n",
    "mmc_in = [0.966, 0.966, 0.966, 0.966, 0.966]\n",
    "mmc_out_CIFAR100 = [0.742, 0.742, 0.742, 0.742, 0.742]\n",
    "mmc_out_SVHN = [0.647, 0.647, 0.647, 0.647, 0.647]\n",
    "\n",
    "auroc_out_CIFAR100 = [0.866, 0.866, 0.866, 0.866, 0.866]\n",
    "auroc_out_SVHN = [0.934, 0.934, 0.934, 0.934, 0.934]\n",
    "\n",
    "\n",
    "print(\"Laplace Bridge time in: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_in), np.std(time_lpb_in)))\n",
    "print(\"Laplace Bridge time out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_out_CIFAR100), np.std(time_lpb_out_CIFAR100)))\n",
    "print(\"Laplace Bridge time out notmnist: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_out_SVHN), np.std(time_lpb_out_SVHN)))\n",
    "\n",
    "print(\"accuracy: {:.03f} with std {:.03f}\".format(np.mean(acc_in), np.std(acc_in)))\n",
    "\n",
    "print(\"MMC in: {:.03f} with std {:.03f}\".format(np.mean(mmc_in), np.std(mmc_in)))\n",
    "print(\"MMC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_CIFAR100), np.std(mmc_out_CIFAR100)))\n",
    "print(\"MMC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_SVHN), np.std(mmc_out_SVHN)))\n",
    "\n",
    "print(\"AUROC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_CIFAR100), np.std(auroc_out_CIFAR100)))\n",
    "print(\"AUROC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_SVHN), np.std(auroc_out_SVHN)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "58EZsST2E-2S"
   },
   "source": [
    "# Laplace Bridge KFAC estimate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 210531,
     "status": "ok",
     "timestamp": 1591121348617,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "4NXHOX4jE8jS",
    "outputId": "829dd220-7a22-4e12-ae34-09014a15199c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total time used for transform: 0.02535\n",
      "total time used for transform: 0.03012\n",
      "total time used for transform: 0.06282\n"
     ]
    }
   ],
   "source": [
    "CIFAR10_test_in_LB_KFAC = predict_LB_KFAC(CIFAR10_model, CIFAR10_test_loader, M_W_post_K, M_b_post_K, U_post_K, V_post_K, B_post_K, cuda=cuda_status, verbose=False, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_CIFAR100_LB_KFAC = predict_LB_KFAC(CIFAR10_model, CIFAR100_test_loader, M_W_post_K, M_b_post_K, U_post_K, V_post_K, B_post_K, cuda=cuda_status, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_SVHN_LB_KFAC = predict_LB_KFAC(CIFAR10_model, SVHN_test_loader, M_W_post_K, M_b_post_K, U_post_K, V_post_K, B_post_K, cuda=cuda_status, timing=True).cpu().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "kQjb5ulTFB7l"
   },
   "outputs": [],
   "source": [
    "#normalize to get the MAP estimate (which is the mode) of the Dirichlet\n",
    "CIFAR10_test_in_LB_KFACn = CIFAR10_test_in_LB_KFAC/CIFAR10_test_in_LB_KFAC.sum(1).reshape(-1,1)\n",
    "CIFAR10_test_out_CIFAR100_LB_KFACn = CIFAR10_test_out_CIFAR100_LB_KFAC/CIFAR10_test_out_CIFAR100_LB_KFAC.sum(1).reshape(-1,1)\n",
    "CIFAR10_test_out_SVHN_LB_KFACn = CIFAR10_test_out_SVHN_LB_KFAC/CIFAR10_test_out_SVHN_LB_KFAC.sum(1).reshape(-1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "D9wsn8byFCE5"
   },
   "outputs": [],
   "source": [
    "acc_in_LB_KFAC, prob_correct_in_LB_KFAC, ent_in_LB_KFAC, MMC_in_LB_KFAC = get_in_dist_values(CIFAR10_test_in_LB_KFACn, targets_CIFAR10)\n",
    "acc_out_CIFAR100_LB_KFAC, prob_correct_out_CIFAR100_LB_KFAC, ent_out_CIFAR100_LB_KFAC, MMC_out_CIFAR100_LB_KFAC, auroc_out_CIFAR100_LB_KFAC = get_out_dist_values(CIFAR10_test_in_LB_KFACn, CIFAR10_test_out_CIFAR100_LB_KFACn, targets_CIFAR100)\n",
    "acc_out_SVHN_LB_KFAC, prob_correct_out_SVHN_LB_KFAC, ent_out_SVHN_LB_KFAC, MMC_out_SVHN_LB_KFAC, auroc_out_SVHN_LB_KFAC = get_out_dist_values(CIFAR10_test_in_LB_KFACn, CIFAR10_test_out_SVHN_LB_KFACn, targets_SVHN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 210501,
     "status": "ok",
     "timestamp": 1591121348625,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "mtWTHB0dFCMK",
    "outputId": "ba685fd8-78a0-4489-bd90-15d57f6e6c29"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[In, Laplace Bridge, CIFAR10] Accuracy: 0.954; average entropy: 0.140;     MMC: 0.966; Prob @ correct: 0.100\n",
      "[Out-CIFAR100, Laplace Bridge, CIFAR10] Accuracy: 0.009; Average entropy: 0.855;    MMC: 0.742; AUROC: 0.866; Prob @ correct: 0.100\n",
      "[Out-SVHN, Laplace Bridge, CIFAR10] Accuracy: 0.093; Average entropy: 1.170;    MMC: 0.650; AUROC: 0.933; Prob @ correct: 0.100\n"
     ]
    }
   ],
   "source": [
    "print_in_dist_values(acc_in_LB_KFAC, prob_correct_in_LB_KFAC, ent_in_LB_KFAC, MMC_in_LB_KFAC, 'CIFAR10', 'Laplace Bridge')\n",
    "print_out_dist_values(acc_out_CIFAR100_LB_KFAC, prob_correct_out_CIFAR100_LB_KFAC, ent_out_CIFAR100_LB_KFAC, MMC_out_CIFAR100_LB_KFAC, auroc_out_CIFAR100_LB_KFAC, 'CIFAR10', 'CIFAR100', 'Laplace Bridge')\n",
    "print_out_dist_values(acc_out_SVHN_LB_KFAC, prob_correct_out_SVHN_LB_KFAC, ent_out_SVHN_LB_KFAC, MMC_out_SVHN_LB_KFAC, auroc_out_SVHN_LB_KFAC, 'CIFAR10', 'SVHN', 'Laplace Bridge')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 182
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 912,
     "status": "ok",
     "timestamp": 1591121503602,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "wAnbbn9KFjJm",
    "outputId": "6c4e9088-a3b4-4aa7-e16e-d79b22c0eebe"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Laplace Bridge time in: 0.019 with std 0.000\n",
      "Laplace Bridge time out CIFAR100: 0.018 with std 0.000\n",
      "Laplace Bridge time out notmnist: 0.046 with std 0.000\n",
      "accuracy: 0.954 with std 0.000\n",
      "MMC in: 0.966 with std 0.000\n",
      "MMC out CIFAR100: 0.741 with std 0.000\n",
      "MMC out SVHN: 0.648 with std 0.003\n",
      "AUROC out CIFAR100: 0.866 with std 0.000\n",
      "AUROC out SVHN: 0.934 with std 0.001\n"
     ]
    }
   ],
   "source": [
    "#Laplace Bridge KFAC results as presented in the main paper\n",
    "#seeds are 123,124,125,126,127\n",
    "time_lpb_in = [0.01866, 0.01882, 0.01865, 0.01834, 0.01876]\n",
    "time_lpb_out_CIFAR100 = [0.01748, 0.01794, 0.01782, 0.01756, 0.01760]\n",
    "time_lpb_out_SVHN = [0.04548, 0.04596, 0.04594, 0.04547, 0.04565]\n",
    "\n",
    "\n",
    "acc_in = [0.954, 0.954, 0.954, 0.955, 0.954]\n",
    "mmc_in = [0.966, 0.966, 0.966, 0.966, 0.966]\n",
    "mmc_out_CIFAR100 = [0.742, 0.741, 0.741, 0.742, 0.741]\n",
    "mmc_out_SVHN = [0.653, 0.645, 0.649, 0.648, 0.643]\n",
    "\n",
    "auroc_out_CIFAR100 = [0.866, 0.867, 0.866, 0.866, 0.867]\n",
    "auroc_out_SVHN = [0.932, 0.935, 0.933, 0.934, 0.936]\n",
    "\n",
    "\n",
    "print(\"Laplace Bridge time in: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_in), np.std(time_lpb_in)))\n",
    "print(\"Laplace Bridge time out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_out_CIFAR100), np.std(time_lpb_out_CIFAR100)))\n",
    "print(\"Laplace Bridge time out notmnist: {:.03f} with std {:.03f}\".format(np.mean(time_lpb_out_SVHN), np.std(time_lpb_out_SVHN)))\n",
    "\n",
    "print(\"accuracy: {:.03f} with std {:.03f}\".format(np.mean(acc_in), np.std(acc_in)))\n",
    "\n",
    "print(\"MMC in: {:.03f} with std {:.03f}\".format(np.mean(mmc_in), np.std(mmc_in)))\n",
    "print(\"MMC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_CIFAR100), np.std(mmc_out_CIFAR100)))\n",
    "print(\"MMC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_SVHN), np.std(mmc_out_SVHN)))\n",
    "\n",
    "print(\"AUROC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_CIFAR100), np.std(auroc_out_CIFAR100)))\n",
    "print(\"AUROC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_SVHN), np.std(auroc_out_SVHN)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "DVBil0N5FghP"
   },
   "source": [
    "# Conditions\n",
    "\n",
    "Test the condition derived in Proposition 1 of the paper and evaluated experimentally in Appendix A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "km2YkVT7c_NU"
   },
   "outputs": [],
   "source": [
    "# check if condition holds\n",
    "\n",
    "def check_condition(alpha_vecs):\n",
    "    #note that this is vectorized\n",
    "    alpha_sum = alpha_vecs.sum(1)\n",
    "    alpha_max = alpha_vecs.max(1)\n",
    "    alpha_sum_minus = alpha_sum - alpha_max\n",
    "    right_side = 0.25 * (np.sqrt(9 * alpha_sum_minus**2 + 10 * alpha_sum_minus + 1) - alpha_sum_minus - 1)\n",
    "    cases = alpha_max > right_side\n",
    "    percentage = np.sum(cases)/len(cases)\n",
    "    return(percentage)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 551468,
     "status": "ok",
     "timestamp": 1588243625471,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "hYEhWziEc_NX",
    "outputId": "658980ba-25bd-4dfa-e3e3-205d90fdc25f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9979\n",
      "0.9299\n",
      "0.8418100799016595\n"
     ]
    }
   ],
   "source": [
    "print(np.sum(check_condition(CIFAR10_test_in_LB)))\n",
    "print(np.sum(check_condition(CIFAR10_test_out_CIFAR100_LB)))\n",
    "print(np.sum(check_condition(CIFAR10_test_out_SVHN_LB)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 72
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 551459,
     "status": "ok",
     "timestamp": 1588243625473,
     "user": {
      "displayName": "Marius Hobbhahn",
      "photoUrl": "",
      "userId": "09428085039491522481"
     },
     "user_tz": -120
    },
    "id": "R4zACU-Nm5qe",
    "outputId": "39f3877c-a17d-4cf9-fccc-7d4bfbce6ccc"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ratio condition fulfilled CIFAR10 in: 0.998 with std: 0.0\n",
      "ratio condition fulfilled CIFAR100 out: 0.925 with std: 0.0\n",
      "ratio condition fulfilled SVHN out: 0.832 with std: 1.1102230246251565e-16\n"
     ]
    }
   ],
   "source": [
    "condition_CIFAR10_in = np.array([0.9977, 0.9977, 0.9977, 0.9977, 0.9977])\n",
    "condition_CIFAR100_out = np.array([0.925, 0.925, 0.925, 0.925, 0.925])\n",
    "condition_SVHN_out = np.array([0.8322833435771358, 0.8322833435771358, 0.8322833435771358, 0.8322833435771358, 0.8322833435771358])\n",
    "\n",
    "print(\"ratio condition fulfilled CIFAR10 in: {:.03f} with std: {}\".format(np.mean(condition_CIFAR10_in), np.std(condition_CIFAR10_in)))\n",
    "print(\"ratio condition fulfilled CIFAR100 out: {:.03f} with std: {}\".format(np.mean(condition_CIFAR100_out), np.std(condition_CIFAR100_out)))\n",
    "print(\"ratio condition fulfilled SVHN out: {:.03f} with std: {}\".format(np.mean(condition_SVHN_out), np.std(condition_SVHN_out)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "IiwWVoohRGXr"
   },
   "source": [
    "# Compare to extended MacKay approach\n",
    "\n",
    "as detailed in Appendix D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "time used for forward pass: 0.8553376197814941\n",
      "time used for Extended MacKay Approach: 5.263708591461182\n",
      "time used for forward pass: 0.7192447185516357\n",
      "time used for Extended MacKay Approach: 3.7200324535369873\n",
      "time used for forward pass: 1.9256739616394043\n",
      "time used for Extended MacKay Approach: 9.614293813705444\n"
     ]
    }
   ],
   "source": [
    "CIFAR10_test_in_EMK = predict_extended_MacKay(CIFAR10_model, CIFAR10_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, verbose=False, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_CIFAR100_EMK = predict_extended_MacKay(CIFAR10_model, CIFAR100_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_SVHN_EMK = predict_extended_MacKay(CIFAR10_model, SVHN_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, timing=True).cpu().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "acc_in_EMK, prob_correct_in_EMK, ent_in_EMK, MMC_in_EMK = get_in_dist_values(CIFAR10_test_in_EMK, targets_CIFAR10)\n",
    "acc_out_CIFAR100_EMK, prob_correct_out_CIFAR100_EMK, ent_out_CIFAR100_EMK, MMC_out_CIFAR100_EMK, auroc_out_CIFAR100_EMK = get_out_dist_values(CIFAR10_test_in_EMK, CIFAR10_test_out_CIFAR100_EMK, targets_CIFAR100)\n",
    "acc_out_SVHN_EMK, prob_correct_out_SVHN_EMK, ent_out_SVHN_EMK, MMC_out_SVHN_EMK, auroc_out_SVHN_EMK = get_out_dist_values(CIFAR10_test_in_EMK, CIFAR10_test_out_SVHN_EMK, targets_SVHN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[In, Extended MacKay, CIFAR10] Accuracy: 0.954; average entropy: 0.081;     MMC: 0.975; Prob @ correct: 0.100\n",
      "[Out-CIFAR100, Extended MacKay, CIFAR10] Accuracy: 0.009; Average entropy: 0.581;    MMC: 0.801; AUROC: 0.880; Prob @ correct: 0.100\n",
      "[Out-SVHN, Extended MacKay, CIFAR10] Accuracy: 0.092; Average entropy: 0.771;    MMC: 0.744; AUROC: 0.929; Prob @ correct: 0.100\n"
     ]
    }
   ],
   "source": [
    "print_in_dist_values(acc_in_EMK, prob_correct_in_EMK, ent_in_EMK, MMC_in_EMK, 'CIFAR10', 'Extended MacKay')\n",
    "print_out_dist_values(acc_out_CIFAR100_EMK, prob_correct_out_CIFAR100_EMK, ent_out_CIFAR100_EMK, MMC_out_CIFAR100_EMK, auroc_out_CIFAR100_EMK, 'CIFAR10', 'CIFAR100', 'Extended MacKay')\n",
    "print_out_dist_values(acc_out_SVHN_EMK, prob_correct_out_SVHN_EMK, ent_out_SVHN_EMK, MMC_out_SVHN_EMK, auroc_out_SVHN_EMK, 'CIFAR10', 'SVHN', 'Extended MacKay')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extended MacKay approach time in: 1.479 with std 0.010\n",
      "Extended MacKay approach time out CIFAR100: 1.501 with std 0.051\n",
      "Extended MacKay approach time out notmnist: 3.829 with std 0.049\n",
      "accuracy: 0.944 with std 0.001\n",
      "MMC in: 0.970 with std 0.001\n",
      "MMC out CIFAR100: 0.801 with std 0.003\n",
      "MMC out SVHN: 0.714 with std 0.036\n",
      "AUROC out CIFAR100: 0.873 with std 0.002\n",
      "AUROC out SVHN: 0.933 with std 0.012\n"
     ]
    }
   ],
   "source": [
    "#Extended MacKay approach as presented in Appendix D\n",
    "#seeds are 123,124,125,126,127\n",
    "time_emk_in = [1.4817545413970947, 1.4886608123779297, 1.482903242111206, 1.4811437129974365, 1.4604389667510986]\n",
    "time_emk_out_CIFAR100 = [1.5755081176757812, 1.4701554775238037, 1.547466516494751, 1.450073003768921, 1.461724042892456]\n",
    "time_emk_out_SVHN = [3.8533170223236084, 3.8127734661102295, 3.8204636573791504, 3.7547571659088135, 3.902277708053589]\n",
    "\n",
    "\n",
    "acc_in = [0.945, 0.945, 0.942, 0.945, 0.942]\n",
    "mmc_in = [0.972, 0.971, 0.970, 0.970, 0.969]\n",
    "mmc_out_CIFAR100 = [0.803, 0.805, 0.798, 0.797, 0.801]\n",
    "mmc_out_SVHN = [0.778, 0.679, 0.726, 0.680, 0.709]\n",
    "\n",
    "auroc_out_CIFAR100 = [0.876, 0.872, 0.873, 0.874, 0.870]\n",
    "auroc_out_SVHN = [0.918, 0.950, 0.922, 0.939, 0.935]\n",
    "\n",
    "\n",
    "print(\"Extended MacKay approach time in: {:.03f} with std {:.03f}\".format(np.mean(time_emk_in), np.std(time_emk_in)))\n",
    "print(\"Extended MacKay approach time out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(time_emk_out_CIFAR100), np.std(time_emk_out_CIFAR100)))\n",
    "print(\"Extended MacKay approach time out notmnist: {:.03f} with std {:.03f}\".format(np.mean(time_emk_out_SVHN), np.std(time_emk_out_SVHN)))\n",
    "\n",
    "print(\"accuracy: {:.03f} with std {:.03f}\".format(np.mean(acc_in), np.std(acc_in)))\n",
    "\n",
    "print(\"MMC in: {:.03f} with std {:.03f}\".format(np.mean(mmc_in), np.std(mmc_in)))\n",
    "print(\"MMC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_CIFAR100), np.std(mmc_out_CIFAR100)))\n",
    "print(\"MMC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_SVHN), np.std(mmc_out_SVHN)))\n",
    "\n",
    "print(\"AUROC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_CIFAR100), np.std(auroc_out_CIFAR100)))\n",
    "print(\"AUROC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_SVHN), np.std(auroc_out_SVHN)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Compare to Second-order Delta Posterior Predictive\n",
    "\n",
    "as detailed in Appendix D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "time used for forward pass: 0.7208783626556396\n",
      "time used for Second order delta posterior predictive: 0.04456305503845215\n",
      "time used for forward pass: 0.7037391662597656\n",
      "time used for Second order delta posterior predictive: 0.043274879455566406\n",
      "time used for forward pass: 1.9783968925476074\n",
      "time used for Second order delta posterior predictive: 0.12188029289245605\n"
     ]
    }
   ],
   "source": [
    "CIFAR10_test_in_SODPP = predict_SODPP(CIFAR10_model, CIFAR10_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, verbose=False, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_CIFAR100_SODPP = predict_SODPP(CIFAR10_model, CIFAR100_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, timing=True).cpu().numpy()\n",
    "CIFAR10_test_out_SVHN_SODPP = predict_SODPP(CIFAR10_model, SVHN_test_loader, M_W_post_D, M_b_post_D, C_W_post_D, C_b_post_D, cuda=cuda_status, timing=True).cpu().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "acc_in_SODPP, prob_correct_in_SODPP, ent_in_SODPP, MMC_in_SODPP = get_in_dist_values(CIFAR10_test_in_SODPP, targets_CIFAR10)\n",
    "acc_out_CIFAR100_SODPP, prob_correct_out_CIFAR100_SODPP, ent_out_CIFAR100_SODPP, MMC_out_CIFAR100_SODPP, auroc_out_CIFAR100_SODPP = get_out_dist_values(CIFAR10_test_in_SODPP, CIFAR10_test_out_CIFAR100_SODPP, targets_CIFAR100)\n",
    "acc_out_SVHN_SODPP, prob_correct_out_SVHN_SODPP, ent_out_SVHN_SODPP, MMC_out_SVHN_SODPP, auroc_out_SVHN_SODPP = get_out_dist_values(CIFAR10_test_in_SODPP, CIFAR10_test_out_SVHN_SODPP, targets_SVHN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[In, SODPP, CIFAR10] Accuracy: 0.954; average entropy: 0.080;     MMC: 0.975; Prob @ correct: 0.100\n",
      "[Out-CIFAR100, SODPP, CIFAR10] Accuracy: 0.009; Average entropy: 0.581;    MMC: 0.797; AUROC: 0.879; Prob @ correct: 0.100\n",
      "[Out-SVHN, SODPP, CIFAR10] Accuracy: 0.092; Average entropy: 0.771;    MMC: 0.741; AUROC: 0.928; Prob @ correct: 0.100\n"
     ]
    }
   ],
   "source": [
    "print_in_dist_values(acc_in_SODPP, prob_correct_in_SODPP, ent_in_SODPP, MMC_in_SODPP, 'CIFAR10', 'SODPP')\n",
    "print_out_dist_values(acc_out_CIFAR100_SODPP, prob_correct_out_CIFAR100_SODPP, ent_out_CIFAR100_SODPP, MMC_out_CIFAR100_SODPP, auroc_out_CIFAR100_SODPP, 'CIFAR10', 'CIFAR100', 'SODPP')\n",
    "print_out_dist_values(acc_out_SVHN_SODPP, prob_correct_out_SVHN_SODPP, ent_out_SVHN_SODPP, MMC_out_SVHN_SODPP, auroc_out_SVHN_SODPP, 'CIFAR10', 'SVHN', 'SODPP')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SODPP time in: 0.024 with std 0.000\n",
      "SODPP time out CIFAR100: 0.023 with std 0.000\n",
      "SODPP time out notmnist: 0.060 with std 0.002\n",
      "accuracy: 0.944 with std 0.002\n",
      "MMC in: 0.970 with std 0.001\n",
      "MMC out CIFAR100: 0.793 with std 0.010\n",
      "MMC out SVHN: 0.710 with std 0.036\n",
      "AUROC out CIFAR100: 0.872 with std 0.002\n",
      "AUROC out SVHN: 0.932 with std 0.012\n"
     ]
    }
   ],
   "source": [
    "#Second order delta posterior predictive as shown in Appendix D\n",
    "#seeds are 123,124,125,126,127\n",
    "time_sodpp_in = [0.024459123611450195, 0.02369832992553711, 0.024019241333007812, 0.023904085159301758, 0.024046659469604492]\n",
    "time_sodpp_out_CIFAR100 = [0.023726463317871094, 0.02320384979248047, 0.023495197296142578, 0.02364373207092285, 0.022989273071289062]\n",
    "time_sodpp_out_SVHN = [0.06233024597167969, 0.058495283126831055, 0.06014561653137207, 0.061838626861572266, 0.05889773368835449]\n",
    "\n",
    "\n",
    "acc_in = [0.945, 0.946, 0.942, 0.945, 0.942]\n",
    "mmc_in = [0.971, 0.971, 0.969, 0.969, 0.969]\n",
    "mmc_out_CIFAR100 = [0.799, 0.801, 0.794, 0.773, 0.797]\n",
    "mmc_out_SVHN = [0.773, 0.675, 0.722, 0.676, 0.705]\n",
    "\n",
    "auroc_out_CIFAR100 = [0.875, 0.871, 0.872, 0.873, 0.870]\n",
    "auroc_out_SVHN = [0.917, 0.949, 0.921, 0.939, 0.935]\n",
    "\n",
    "\n",
    "print(\"SODPP time in: {:.03f} with std {:.03f}\".format(np.mean(time_sodpp_in), np.std(time_sodpp_in)))\n",
    "print(\"SODPP time out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(time_sodpp_out_CIFAR100), np.std(time_sodpp_out_CIFAR100)))\n",
    "print(\"SODPP time out notmnist: {:.03f} with std {:.03f}\".format(np.mean(time_sodpp_out_SVHN), np.std(time_sodpp_out_SVHN)))\n",
    "\n",
    "print(\"accuracy: {:.03f} with std {:.03f}\".format(np.mean(acc_in), np.std(acc_in)))\n",
    "\n",
    "print(\"MMC in: {:.03f} with std {:.03f}\".format(np.mean(mmc_in), np.std(mmc_in)))\n",
    "print(\"MMC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_CIFAR100), np.std(mmc_out_CIFAR100)))\n",
    "print(\"MMC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(mmc_out_SVHN), np.std(mmc_out_SVHN)))\n",
    "\n",
    "print(\"AUROC out CIFAR100: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_CIFAR100), np.std(auroc_out_CIFAR100)))\n",
    "print(\"AUROC out SVHN: {:.03f} with std {:.03f}\".format(np.mean(auroc_out_SVHN), np.std(auroc_out_SVHN)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [
    "BdICbIMYc_LJ",
    "UqikIW_Cc_Lb",
    "ZZj9IvJOc_MX",
    "wl2O4llSc_M1"
   ],
   "name": "Exp2_LPA_resnet_CIFAR10.ipynb",
   "provenance": [
    {
     "file_id": "1VhkPnCiC-FaV53c7VpDH44oeUMhNIIfy",
     "timestamp": 1587034936292
    }
   ],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
